package com.itheima.controller;

import com.alibaba.excel.EasyExcel;
import com.itheima.pojo.Attendance;
import com.itheima.pojo.AttendanceTemplate;
import com.itheima.pojo.Result;
import com.itheima.service.AttendanceService;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class AttendanceExcelController {

    @Autowired
    private AttendanceService attendanceService;

    @Autowired
    private EmpService empService;
    /**
     * 下载考勤模板
     * 这个方法用于下载一个 Excel 文件，作为上传考勤数据时的模板。
     * 模板文件包含了样本数据或为空模板，用户可以按照模板填充数据并上传。
     */
    @GetMapping("/downloadAttendanceTemplate")
    public ResponseEntity<Object> downloadTemplate(HttpServletResponse response) throws IOException {
        // 设置响应头，指定文件类型为 Excel，并指定文件名
        response.setContentType("application/vnd.ms-excel");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=attendance_template.xlsx");

        // 模拟一些示例数据，通常这个数据可以为空，或者是一些简单的字段示例
        List<AttendanceTemplate> templateData = Arrays.asList(
            // 这里可以填充一些空数据或示例数据
//            new AttendanceTemplate("张三", "2025-03-01", "09:00", "18:00", 1, "正常"),
//            new AttendanceTemplate("李四", "2025-03-01", "09:15", "17:45", 2, "迟到")
        );

        // 使用 EasyExcel 写入模板数据到响应输出流，生成 Excel 文件
        EasyExcel.write(response.getOutputStream(), AttendanceTemplate.class)
                .sheet("考勤模板")
                .doWrite(templateData); // 写入模板数据

        // 返回状态码 200，表示文件已成功下载
        return ResponseEntity.status(HttpStatus.OK).build();
    }

    /**
     * 导入考勤数据
     * 该方法处理文件上传，解析 Excel 文件中的考勤数据，并将其存储到数据库中。
     * 成功导入数据后，返回一个成功消息；如果导入过程中发生异常，返回错误消息。
     */
    @PostMapping("/importAttendanceData")
    public Result<Object> importAttendanceData(@RequestParam("file") MultipartFile file) throws IOException {
        try {
            // 解析上传的 Excel 文件，使用 EasyExcel 将文件内容映射为 AttendanceTemplate 对象列表
            List<AttendanceTemplate> attendanceData = EasyExcel.read(file.getInputStream())
                    .head(AttendanceTemplate.class)  // 将 Excel 每行映射为 AttendanceTemplate 对象
                    .sheet()
                    .doReadSync();  // 同步读取 Excel 数据

            // 将 Excel 中的 AttendanceTemplate 数据转换为实际的考勤对象，并根据员工名称匹配员工 ID
            List<Attendance> attendanceList = attendanceData.stream().map(attTemplate -> {
                // 根据员工名称查询员工 ID
                String employeeName = attTemplate.getEmployeeName();
                Integer employeeId = empService.findEmployeeIdByUsername(employeeName);  // 通过员工名称获取 employeeId

                // 创建考勤对象
                return new Attendance(
                        employeeId,  // 设置员工 ID
                        attTemplate.getEmployeeName(),
                        attTemplate.getAttendanceDate(),
                        attTemplate.getCheckinTime(),
                        attTemplate.getCheckoutTime(),
                        attTemplate.getStatus(),
                        attTemplate.getRemark()
                );
            }).collect(Collectors.toList());

            // 将转换后的考勤数据批量保存到数据库
            attendanceService.saveBatch(attendanceList);

            // 返回导入成功的信息
            return Result.success("考勤数据导入成功");
        } catch (Exception e) {
            // 如果导入过程中发生任何异常，捕获异常并返回错误信息
            return Result.error("导入失败: " + e.getMessage());
        }
    }

    /**
     * 导出考勤数据
     * 这个方法用于将数据库中的考勤数据导出为 Excel 文件。
     * 用户可以下载这个文件进行查看或进一步操作。
     */
    @GetMapping("/exportAttendanceData")
    public ResponseEntity<Object> exportAttendanceData(HttpServletResponse response) throws IOException {
        // 设置响应头，指定文件类型为 Excel，并指定文件名
        response.setContentType("application/vnd.ms-excel");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=attendance_data.xlsx");

        // 从数据库中获取所有考勤数据
        List<Attendance> attendanceData = attendanceService.list();

        // 将查询到的考勤数据转换为 AttendanceTemplate 格式，这样可以方便 EasyExcel 导出
        List<AttendanceTemplate> attendanceTemplateData = attendanceData.stream()
                .map(attendance -> new AttendanceTemplate(
                        attendance.getEmployeeName(),
                        attendance.getAttendanceDate(),
                        attendance.getCheckinTime(),
                        attendance.getCheckoutTime(),
                        attendance.getStatus(),
                        attendance.getRemark()
                ))
                .collect(Collectors.toList());

        // 使用 EasyExcel 写入考勤数据到响应输出流，生成 Excel 文件
        EasyExcel.write(response.getOutputStream(), AttendanceTemplate.class)
                .sheet("考勤数据")  // 工作表名称
                .doWrite(attendanceTemplateData);  // 写入考勤数据

        // 返回状态码 200，表示文件已成功生成并准备下载
        return ResponseEntity.status(HttpStatus.OK).build();
    }
}
